<?php
include_once 'Conect.php';
/**
 * CLASE GENERAL EQUIPO
 *
 * Clase que abstrae los Torneos que se manejan en el sistema.
 * @author CLOCK PROGRAMMING
 * @version 1.0
 * @package Modelo
 */
class Torneo
{
    /**
     * Nombre del Torneo
     * @access public
     * @var String
     * @name $nombre
     */
    public  $nombre;
    /**
     * Id del Torneo
     * @access public
     * @var String
     * @name $Id
     */
    public  $id;
    /**
     * Instancia de la clase encargada de realizar la conexion
     * @access private
     * @var Conect
     * @name $conexion
     */
    private $conexion;


    /**
     * CONSTRUCTOR PARA CARGAR UN OBJETO TORNEO PARTIENDO DEL ID DEL TORNEO
     * @param integer $nombre,String $nombre,integer $tipoConstructor
     * @return Torneoclass
     */
    function __construct($id,$nombre,$tipoConstructor)
    {
        if($tipoConstructor==1)$this->id=$id;//CREAR TORNEO COMO INSTANCIA
        else if($tipoConstructor==2)//CREAR EL TORNEO DESDE CERO
            $this->nombre=$nombre;
        $this->conexion=new Conect();
    }



    /**
     * M�todo para ingresar  un nuevo torneo al sistema, recibe el nombre y las fechas que se van a jugar.
     * @param string $nombre Nombre del torneo.
     * @param DateTime  $Fechas Arreglo con las fechas de los partidos
     * @return Resultado Booleano  indicando el exito de la transaccion.
     */
    function crearTorneo( $Fechas)
    {
        try
        {

            $consulta="INSERT INTO `miscore`.`torneo` (`Id` ,`Nombre` ,`Estado`)
            VALUES (NULL ,'".$this->nombre."' ,'1');";
            $resultadoEjecucion=mysql_query($consulta,$this->conexion-> conectarse());
            //SI SE HA CREADO EXITOSAMENTE EL TORNEO
            if($resultadoEjecucion && count($Fechas)>0){

                $idTorneo=mysql_insert_id();
                //RECORREMOS TODAS LAS FECHAS
                for($i=0;$i<count($Fechas);$i++)
                {
                    $consulta="INSERT INTO `miscore`.`partido` (`Id` ,`Equipo1` ,`Equipo2`,`GolesE1`,`GolesE2`,`IdTorneo`,`Fecha`,`Jugado`)
                    VALUES (NULL ,'1','1','0','0','".$idTorneo."','".$Fechas[$i]."','');";
                    $resultadoEjecucion=mysql_query($consulta,$this->conexion-> conectarse());
                }
            }
            else return false;

            return true;
        }
        catch (Exception $e)
        {
            echo 'Caught exception: ',  $e->getMessage(), "\n";
            return false;
        }
    }


    /**
     * M�todo para sortear el torneo dependiendo de las fechas previstas y los equipos que ya se encuentran asociados al torneo, el  metodo
     * va a evaluar si se puede o no realizar el sorteo correspondiente.
     * @param Integer $Idtorneo Id del torneo, este reside en la instancia del torneo que se este manejando.
     * @return Integer indicando el exito o el fracaso del sorteo. 0 - TORNEO EXITOSO , 1 - NO EXISTEN FECHAS ASOCIADAS AL TORNEO
     * 2- NO EXISTEN FECHAS ASOCIADAS AL TORNEO , 3- NO EXISTEN EQUIPOS SUFICIENTES PARA LAS FECHAS DEL TORNEO ,
     * 4-LA CANTIDAD DE  EQUIPOS EXCEDE LAS FECHAS DEL TORNEO.
     */

    function sortearTorneo()
    {
        try
        {

            $consultaEquipos="SELECT DISTINCT equipo.Id,equipo.Nombre FROM equipotorneo Inner Join equipo ON equipo.Id = equipotorneo.IdEquipo
            WHERE equipotorneo.IdTorneo='".$this->id."';";
            $resultadoEquipo=mysql_query($consultaEquipos,$this->conexion-> conectarse());

            $consultaFechas="SELECT DISTINCT partido.Id, partido.Fecha FROM partido WHERE partido.IdTorneo='".$this->id."';";
            $resultadoFechas=mysql_query($consultaFechas,$this->conexion-> conectarse());



            if ($resultadoEquipo && mysql_num_rows($resultadoEquipo)!=0)//VALIDAMOS QUE EXISTAN EQUIPOS RELACIONADOS A ESTE TORNEO
            {
                if($resultadoFechas && mysql_num_rows($resultadoFechas)!=0)//VALIDAMOS QUE EXISTAN FECHAS RELACIONADOS A ESTE TORNEO
                {
                    //APARTIR DE LOS EQUIPOS CALCULAMOS LAS FECHAS QUE SE NECESITAN PARA PODER SORTEAR EL TORNEO
                    $equipos=mysql_num_rows($resultadoEquipo);
                    $totalFechasSegunEquiposRegistrados=($equipos*$equipos)-$equipos;
                    //SE CALCULAN LOS EQUIPOS A PARTIR DE LAS FECHAS LA CANTIDAD DE EQUIPOS QUE DEBEN EXISTIR.
                    $fechas=mysql_num_rows($resultadoFechas);
                    $Nequipos=($fechas+$equipos)/$equipos;



                    if($Nequipos==$equipos)// SI SE HAN INGRESADO LAS FECHAS Y EQUIPOS NECESARIOS
                    {
                        $matchs=array();//ARREGLO TEMPORAL PARA SORTEAR LAS FECHAS Y LOS EQUIPOS
                        //RECORREMOS LOS EQUIPOS Y LOS CARGAMOS A UN ARREGLO DE EQUIPOS
                        for ($i = 0; $i < mysql_num_rows($resultadoEquipo); $i++)
                            $equiposAsortear[$i]=mysql_result($resultadoEquipo, $i, 0);
                         
                        //CONSTRUIMOS LA MATRIZ PARA CRUZAR LOS EQUIPO
                        for ($Equipo1 = 0; $Equipo1 < count($equiposAsortear); $Equipo1++)
                        {
                            for($Equipo2 = 0; $Equipo2 < count($equiposAsortear); $Equipo2++)
                            {
                                if($Equipo1==$Equipo2)$matrizPartidos[$Equipo1][$Equipo2]="Null";//EVITAMOS QUE JUEGEN CONTRA ELLOS MISMOS.
                                else//SE ASOCIA A UNA FECHA ESPECIFICA
                                {
                                    //CONSULTAMOS LAS FECHAS Y ASIGNAMOS LOS PARTIDOS
                                    $guarda=false;
                                    while(!$guarda){// POR CADA FECHA SE ASIGNA A UN PARTIDO DIFERENTE.

                                        $posicionAleatoria=	rand(0, mysql_num_rows($resultadoFechas)-1);//GENERAMOS UN PARTIDO AL AZAR
                                        if(!in_array($posicionAleatoria,$matchs)){//VALIDAMOS QUE EL ID DEL PARTIDO SORTEADO NO SE ENCUENTRE YA ASIGNADO
                                            $matchs[] = $posicionAleatoria;//AGREGAMOS LA POSICION PARA NO VOLVERLA A TOMAR Y EVITAR PERDER FECHAS
                                            $consulta="UPDATE  `miscore`.`partido`  set  `Equipo1`='".$equiposAsortear[$Equipo1]."', `Equipo2`='".$equiposAsortear[$Equipo2]."' WHERE `Id`='".mysql_result($resultadoFechas, $posicionAleatoria, 0)."' ;";
                                            $guarda=mysql_query($consulta,$this->conexion-> conectarse());

                                        }
                                    }
                                }
                            }
                        }
                        return 0;//TORNEO SORTEADO EXITOSAMENTE
                    }
                    else
                    {
                        if($Nequipos>$equipos)
                            return 3;//LA CANTIDAD DE EQUIPOS NO ES SUFICIENTE PARA LAS FECHAS PROYECTADAS EN EL TORNEO.
                        else if ($Nequipos<$equipos)
                            return 4;//LA CANTIDAD DE EQUIPOS EXCEDE  LAS FECHAS PROYECTADAS EN EL TORNEO.

                    }

                }else return 1;//NO EXISTEN FECHAS  ASOCIADAS AL TORNEO.

            }else return 2;//NO EXISTEN EQUIPOS ASOCIADOS AL TORNEO


        }catch (Exception $e)
        {
            echo 'Caught exception: ',  $e->getMessage(), "\n";
            return 5;//ERROR EN LA GENERACION
        }
    }

    /**
     * M�todo para asociar los equipos(Array con los identificadores de los equipos a participar)  a un torneo especifico, los equipos
     * ya se deben encontrar registrados en el sistema.
     * @param Integer $Idtorneo Id del torneo, este reside en la instancia del torneo que se este manejando.
     * @param Array  $Equipos Arreglo con los id  de los partidos
     * @return Resultado booleano   indicando el exito de la operacion.
     */

    function asociarEquiposTorneo($Equipos)
    {

        try
        {	//VALIDACION PARA EVITAR ARREGLOS NULLOS
            if( count($Equipos)>0){

                $consultaValidacionTorneo="SELECT DISTINCT equipotorneo.Id  FROM equipotorneo WHERE equipotorneo.IdTorneo ='".$this->id."';";
                $resultadoEquipo=mysql_query($consultaValidacionTorneo,$this->conexion-> conectarse());
                if(mysql_num_rows($resultadoEquipo)==0){
                     
                    //RECORREMOS TODAS LAS FECHAS
                    for($i=0;$i<count($Equipos);$i++)
                    {
                        $consulta="INSERT INTO `miscore`.`equipotorneo` (`Id` ,`IdEquipo` ,`IdTorneo`)
                        VALUES (NULL ,'".$Equipos[$i]."','".$this->id."');";
                        $resultadoEjecucion=mysql_query($consulta,$this->conexion->conectarse());

                    }
                    return  true;//SE SORTEO EXITOSAMENTE.
                }
                else return  false;//YA SE ENCUENTRA CON EQUIPOS ASOCIADOS EL TORNEO.
            }else return false;//ARREGLO VACIO DE EQUIPO

        }
        catch (Exception $e)
        {
            echo 'Caught exception: ',  $e->getMessage(), "\n";
            return false;
        }

    }



}
